package qgs.zisu.javaconcurrency.javaconcurrency.chapter7_synchronized;

/**
 * @Author: 蔡翔
 * @Date: 2019/9/5 20:50
 * @Version 1.0
 *
 * 如果 要 把业务数据和逻辑数据（代码的执行单元），从线程里面抽取出来。。那么久需要用Runnable 接口了。
 */
public class TicketWindowRunnable implements Runnable {
    // 问题：在多线程情况下 对共享数据的修改会有一个问题（存在超额消费）（就是线程不安全问题）
    private int index = 0;
    private final static int MAX = 500;
    // 很多线程访问的 变量 是同一份，那么这个变量存在线程安全的问题。
    // 如果线程资源不同步的话，那么很可能 输出的号码会超过500，也就是说会超额消费。
    // （造成上诉原因是因为cpu的上下文切换导致一个线程执行到一半不执行了，另外一个线程开始执行）

    //解决方式： 同步代码块的方式
    private final Object MONITOR = new Object();


    @Override
    public void run() {
        // synchronized(){} 就相当于一个栅栏，当多线程执行到这里后 ，要执行synchronized里面代码就变成了串行，一次只能由一个线程执行
        synchronized (MONITOR){
            while (true){
                if(index>MAX){
                    break;
                }
                System.out.println(Thread.currentThread()+" 的号码是："+(index++));
            }
        }
    }
}
